Obiettivo: Sviluppare in Python una classe per la gestione dell'inventario di un magazzino, utilizzando i dati in formato JSON come database persistente.
La società "TechSupplies S.p.A." ha bisogno di un sistema che gestisca il suo inventario di prodotti elettronici e tracci i movimenti logistici in un file JSON chiamato magazzino.json.
Gli studenti devono creare il file iniziale magazzino.json con la seguente struttura:
inventario (un array di oggetti) e logistica (un oggetto annidato).inventario: Contiene la lista dei prodotti, ognuno rappresentato da un oggetto JSON con le seguenti proprietà (utilizzando i tipi di dati JSON corretti: stringa, numero, booleano, null):
codice_sku (stringa univoca)nome_prodotto (stringa)prezzo_unitario (numero, decimale)quantita_disponibile (numero, intero)fornitore_principale (stringa, deve usare la convenzione snake_case)data_ultimo_carico (stringa, formato data ISO 8601)in_riordino (booleano)note_speciali (deve essere null se non ci sono note)logistica: Contiene le seguenti proprietà:
regioni_spedizione (un array di stringhe, contenente almeno 3 regioni)ultimo_aggiornamento (stringa data/ora)errori_di_carico (numero, intero)Creare il file magazzino.json con almeno **tre** prodotti diversi, assicurandosi che sia sintatticamente **valido** (verificare l'assenza di virgole finali, l'uso esclusivo delle virgolette doppie per chiavi e stringhe, ecc.).
Gli studenti devono creare una classe Python MagazzinoManager che gestisca la persistenza dei dati utilizzando il modulo json.
| Mappatura Tipi | Python | JSON |
|---|---|---|
| Dizionario | dict | object |
| Lista | list | array |
| Stringa | str | string |
| Numero | int o float | number |
| Booleano | True / False | true / false |
| Nullo | None | null |
__init__): La classe deve tentare di caricare i dati dal file magazzino.json (Deserializzazione: json.load). Se il file non esiste o è vuoto, deve inizializzare la struttura con dati vuoti predefiniti.salva_dati): Implementare un metodo che salvi la struttura dati corrente nel file magazzino.json (Serializzazione: json.dump). Il salvataggio deve usare l'argomento indent=4 per garantire la leggibilità (pretty-print).aggiungi_prodotto): Un metodo che riceva i dati di un nuovo prodotto come argomenti, lo aggiunga all'array inventario e chiami salva_dati.Implementare la classe MagazzinoManager con i metodi __init__, salva_dati e aggiungi_prodotto.
Aggiungere i seguenti metodi avanzati alla classe MagazzinoManager.
trova_articoli_rari): Implementare un metodo che filtri e restituisca tutti i prodotti la cui quantita_disponibile è inferiore a una soglia passata come parametro (es. 5).calcola_valore_totale): Implementare un metodo che calcoli e restituisca il valore monetario totale dell'inventario.
Formula: Somma (quantita_disponibile * prezzo_unitario) per ogni prodotto.
carica_dati_sicuro): Modificare il metodo di caricamento o crearne uno nuovo che implementi un blocco try-except per gestire l'errore di decoding JSON (utilizzando json.JSONDecodeError). In caso di errore di parsing, il sistema deve stampare un messaggio di errore chiaro e caricare una struttura dati vuota per evitare il crash.registra_errore_logistico): Un metodo che incrementi il contatore errori_di_carico all'interno dell'oggetto logistica e aggiorni la proprietà ultimo_aggiornamento con il timestamp corrente (richiede l'uso del modulo datetime di Python e la gestione della sua serializzazione).Implementare i metodi avanzati e dimostrare il loro corretto funzionamento:
json.JSONDecodeError).trova_articoli_rari e calcola_valore_totale.registra_errore_logistico e verificare che il file magazzino.json venga aggiornato correttamente con il nuovo contatore e il timestamp.| Criterio | Punti Max | Dettagli |
|---|---|---|
| Sintassi JSON | 10 | File magazzino.json è perfettamente valido, corretto uso di tipi/virgolette/virgole finali. |
| Deserializzazione | 15 | Corretto uso di json.load() e gestione del file non esistente/vuoto. |
| Serializzazione | 15 | Corretto uso di json.dump() con indent=4. |
| Error Handling | 20 | Gestione esplicita di json.JSONDecodeError e logica di fallback. |
| Analisi Dati | 25 | Funzioni di filtro (trova_articoli_rari) e calcolo (calcola_valore_totale) corrette. |
| Manipolazione Dati | 15 | Corretta implementazione di registra_errore_logistico (update del contatore e timestamp). |
| Totale | 100 punti |